import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class TournamentRanking {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int N = scanner.nextInt(); // 队伍的个数
            int M = scanner.nextInt(); // 比赛的场数
            int[][] wins = new int[N][N]; // 记录胜利情况
            int[] inDegree = new int[N]; // 记录每个队伍的输的次数

            // 初始化胜利矩阵和入度数组
            Arrays.fill(inDegree, 0);
            for (int i = 0; i < N; i++) {
                Arrays.fill(wins[i], 0);
            }

            // 读取比赛结果
            for (int i = 0; i < M; i++) {
                int P1 = scanner.nextInt() - 1; // 队伍编号从1开始，转换为从0开始的索引
                int P2 = scanner.nextInt() - 1;
                wins[P1][P2] = 1; // P1 赢了 P2
                inDegree[P2]++; // P2 输了一次
            }

            // 使用拓扑排序确定排名
            Queue<Integer> queue = new LinkedList<>();
            for (int i = 0; i < N; i++) {
                if (inDegree[i] == 0) {
                    queue.offer(i);
                }
            }

            // 存储排名
            int[] ranking = new int[N];
            int index = 0;
            while (!queue.isEmpty()) {
                int current = queue.poll();
                ranking[index++] = current + 1; // 输出队伍编号（加1是因为队伍编号从1开始）
                for (int i = 0; i < N; i++) {
                    if (wins[current][i] == 1) {
                        inDegree[i]--;
                        if (inDegree[i] == 0) {
                            queue.offer(i);
                        }
                    }
                }
            }

            // 输出排名，编号小的队伍在前
            for (int i = 0; i < N; i++) {
                System.out.print(ranking[i] + " ");
            }
            System.out.println(); // 换行
        }
        scanner.close();
    }
}